/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorApadrinamiento;
import ongd.negocio.gestion.ControladorSocio;
import ongd.negocio.gestion.Fraccionado;
import ongd.negocio.gestion.Persona;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Elena
 */
@ManagedBean
@ViewScoped
public class Insertar_Persona  extends ABean{
    /**
     * Objeto del tipo controladorSocio que nos servirá para crear las 
     * instancias correspondientes a la inserción de un socio.
     */
    private ControladorSocio contS;
    /**
     * Objeto del tipo controladorApadrinamiento que nos servirá para crear las
     * instancias correspondientes a la inserción de un padrino.
     */
    private ControladorApadrinamiento contA;
    /**
     * Objeto del tipo persona que va a contener los datos del nuevo socio
     * o padrino.
     */
    private Persona persona;
    /**
     * Objeto de tipo List que contendrá una lista con el tipo del pago 
     * seleccionado por el usuario.
     */
    private List<Fraccionado> tipoPago;
    /**
     * Objeto de tipo Fraccionado.
     */
    private Fraccionado fmes;
    
     /**
     * Constructor de la clase.
     */
    public Insertar_Persona() {
        persona = new Persona();
        tipoPago = new ArrayList<Fraccionado>();
        fmes = new Fraccionado();
    }
    
     /**
     * Método que servirá para cargar los parámetros iniciales en función de
     * la variable pasada al cargar la página.
     */
    @Override
    public void cargaInicial() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            //lo que se quiera hacer sólo cuando cargue inicialmente la página.
            //Si voy a crear un socio, me creare el controlador de socio apropiado para ello.
            if (sesion.getStrVariable().compareTo("socio") == 0) {
                contS = sesion.getControladorSocio();
                persona.setTipo("S");
            } else if (sesion.getStrVariable().compareTo("padrino") == 0) {
                contA = sesion.getControladorApadrinamiento();
                persona.setTipo("P");
            }
        }
        //lo que se quiera hacer siempre que se pulsa un botón o hay una llamada java desde el xhtml
    }

    /**
     * Método que se encargará de llamar a los método adecuados para crear 
     * el socio o el padrino respectivamente.
     * @return null
     */
    public String guardarSocio() {
        try {
            //Si voy a crear un socio.
            if (contS != null) {
                contS.crearSocio(persona, tipoPago);
            } else if (contA != null) {
                contA.crearPadrino(persona, tipoPago);
            }
            //Si llegamos hasta aqui es que el socio o padrino se ha creado correctamente.
            RequestContext requestContext = RequestContext.getCurrentInstance();
            requestContext.addCallbackParam("finOK", true);
            //Instancio de nuevo los atributos para poder empezar de cero.
            persona = new Persona();
            tipoPago = new ArrayList<Fraccionado>();
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(Insertar_Persona.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(Insertar_Persona.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Método que se encargará de guardar en la lista el fraccionado 
     * seleccionado por el usuario.
     * @return null
     */
    public String configurarTipoPago() {
        boolean repetido = false;             
       for(Fraccionado f:tipoPago){           
            if (f.getMes().compareTo(fmes.getMes()) == 0) {
                repetido = true;
            }
        }
        //Si no hay meses repetidos guardamos la fraccion en la lista
        if (!repetido) {
            tipoPago.add(fmes);
        }
        fmes = new Fraccionado();
        return null;
    }

    /**
     * Método que obtiene el tipoPago.
     * @return lista con el tipo de pago
     */
    public List<Fraccionado> getTipoPago() {
        return tipoPago;
    }

    /**
     * Método que establece el tipo de pago.
     * @param tipoPago 
     */
    public void setTipoPago(List<Fraccionado> tipoPago) {
        this.tipoPago = tipoPago;
    }

    /**
     * Método que devuelve un objeto de tipo fraccionado.
     * @return fmes
     */
    public Fraccionado getFmes() {
        return fmes;
    }

    /**
     * Método que establece un objeto de tipo fraccionado.
     * @param fmes 
     */
    public void setFmes(Fraccionado fmes) {
        this.fmes = fmes;
    }

    /**
     * Método que devuelve un objeto de tipo persona.
     * @return Persona
     */
    public Persona getPersona() {
        return persona;
    }
    
    /**
     * Método que establece un objeto de tipo persona.
     * @param persona 
     */
    public void setPersona(Persona persona) {
        this.persona = persona;
    }
}